/*! dom-to-image 25-09-2016 */ ! function(a) {
    "use strict";

    function b(a, b) {
        function c(a) {
            return b.bgcolor && (a.style.backgroundColor = b.bgcolor), b.width && (a.style.width = b.width + "px"), b.height && (a.style.height = b.height + "px"), b.style && Object.keys(b.style).forEach(function(c) { a.style[c] = b.style[c] }), a
        }
        return b = b || {}, Promise.resolve(a).then(function(a) {
            return h(a, b.filter, !0)
        }).then(i).then(j).then(c).then(function(c) {
            return k(c, b.width || p.width(a), b.height || p.height(a))
        })
    }

    function c(a, b) {
        return g(a, b || {}).then(function(b) {
            return b.getContext("2d").getImageData(0, 0, p.width(a), p.height(a)).data
        })
    }

    function d(a, b) {
        return g(a, b || {}).then(function(a) {
            return a.toDataURL()
        })
    }

    function e(a, b) {
        return b = b || {}, g(a, b).then(function(a) {
            return a.toDataURL("image/jpeg", b.quality || 1)
        })
    }

    function f(a, b) {
        return g(a, b || {}).then(p.canvasToBlob)
    }

    function g(a, c) {
        function d(a) {
            var b = document.createElement("canvas");
            if (b.width = c.width || p.width(a), b.height = c.height || p.height(a), c.bgcolor) {
                var d = b.getContext("2d");
                d.fillStyle = c.bgcolor, d.fillRect(0, 0, b.width, b.height)
            }
            return b
        }
        return b(a, c).then(p.makeImage).then(p.delay(100)).then(function(b) {
            var c = d(a);
            return c.getContext("2d").drawImage(b, 0, 0), c
        })
    }

    function h(a, b, c) {
        function d(a) {
            return a instanceof HTMLCanvasElement ? p.makeImage(a.toDataURL()) : a.cloneNode(!1)
        }

        function e(a, b, c) {
            function d(a, b, c) {
                var d = Promise.resolve();
                return b.forEach(function(b) {
                    d = d.then(function() {
                        return h(b, c)
                    }).then(function(b) { b && a.appendChild(b) })
                }), d
            }
            var e = a.childNodes;
            return 0 === e.length ? Promise.resolve(b) : d(b, p.asArray(e), c).then(function() {
                return b
            })
        }

        function f(a, b) {
            function c() {
                function c(a, b) {
                    function c(a, b) { p.asArray(a).forEach(function(c) { b.setProperty(c, a.getPropertyValue(c), a.getPropertyPriority(c)) }) }
                    a.cssText ? b.cssText = a.cssText : c(a, b)
                }
                c(window.getComputedStyle(a), b.style)
            }

            function d() {
                function c(c) {
                    function d(a, b, c) {
                        function d(a) {
                            var b = a.getPropertyValue("content");
                            return a.cssText + " content: " + b + ";"
                        }

                        function e(a) {
                            function b(b) {
                                return b + ": " + a.getPropertyValue(b) + (a.getPropertyPriority(b) ? " !important" : "")
                            }
                            return p.asArray(a).map(b).join("; ") + ";"
                        }
                        var f = "." + a + ":" + b,
                            g = c.cssText ? d(c) : e(c);
                        return document.createTextNode(f + "{" + g + "}")
                    }
                    var e = window.getComputedStyle(a, c),
                        f = e.getPropertyValue("content");
                    if ("" !== f && "none" !== f) {
                        var g = p.uid();
                        b.className = b.className + " " + g;
                        var h = document.createElement("style");
                        h.appendChild(d(g, c, e)), b.appendChild(h)
                    }
                }[":before", ":after"].forEach(function(a) { c(a) })
            }

            function e() { a instanceof HTMLTextAreaElement && (b.innerHTML = a.value), a instanceof HTMLInputElement && b.setAttribute("value", a.value) }

            function f() {
                b instanceof SVGElement && (b.setAttribute("xmlns", "http://www.w3.org/2000/svg"), b instanceof SVGRectElement && ["width", "height"].forEach(function(a) {
                    var c = b.getAttribute(a);
                    c && b.style.setProperty(a, c)
                }))
            }
            return b instanceof Element ? Promise.resolve().then(c).then(d).then(e).then(f).then(function() {
                return b
            }) : b
        }
        return c || !b || b(a) ? Promise.resolve(a).then(d).then(function(c) {
            return e(a, c, b)
        }).then(function(b) {
            return f(a, b)
        }) : Promise.resolve()
    }

    function i(a) {
        return r.resolveAll().then(function(b) {
            var c = document.createElement("style");
            return a.appendChild(c), c.appendChild(document.createTextNode(b)), a
        })
    }

    function j(a) {
        return s.inlineAll(a).then(function() {
            return a
        })
    }

    function k(a, b, c) {
        return Promise.resolve(a).then(function(a) {
            return a.setAttribute("xmlns", "http://www.w3.org/1999/xhtml"), (new XMLSerializer).serializeToString(a)
        }).then(p.escapeXhtml).then(function(a) {
            return '<foreignObject x="0" y="0" width="100%" height="100%">' + a + "</foreignObject>"
        }).then(function(a) {
            return '<svg xmlns="http://www.w3.org/2000/svg" width="' + b + '" height="' + c + '">' + a + "</svg>"
        }).then(function(a) {
            return "data:image/svg+xml;charset=utf-8," + a
        })
    }

    function l() {
        function a() {
            var a = "application/font-woff",
                b = "image/jpeg";
            return { woff: a, woff2: a, ttf: "application/font-truetype", eot: "application/vnd.ms-fontobject", png: "image/png", jpg: b, jpeg: b, gif: "image/gif", tiff: "image/tiff", svg: "image/svg+xml" }
        }

        function b(a) {
            var b = /\.([^\.\/]*?)$/g.exec(a);
            return b ? b[1] : ""
        }

        function c(c) {
            var d = b(c).toLowerCase();
            return a()[d] || ""
        }

        function d(a) {
            return a.search(/^(data:)/) !== -1
        }

        function e(a) {
            return new Promise(function(b) {
                for (var c = window.atob(a.toDataURL().split(",")[1]), d = c.length, e = new Uint8Array(d), f = 0; f < d; f++) e[f] = c.charCodeAt(f);
                b(new Blob([e], { type: "image/png" }))
            })
        }

        function f(a) {
            return a.toBlob ? new Promise(function(b) { a.toBlob(b) }) : e(a)
        }

        function g(a, b) {
            var c = document.implementation.createHTMLDocument(),
                d = c.createElement("base");
            c.head.appendChild(d);
            var e = c.createElement("a");
            return c.body.appendChild(e), d.href = b, e.href = a, e.href
        }

        function h() {
            var a = 0;
            return function() {
                function b() {
                    return ("0000" + (Math.random() * Math.pow(36, 4) << 0).toString(36)).slice(-4)
                }
                return "u" + b() + a++
            }
        }

        function i(a) {
            return new Promise(function(b, c) {
                var d = new Image;
                d.onload = function() { b(d) }, d.onerror = c, d.src = a
            })
        }

        function j(a) {
            var b = 3e4;
            return new Promise(function(c) {
                function d() {
                    if (4 === g.readyState) {
                        if (200 !== g.status) return void f("cannot fetch resource: " + a + ", status: " + g.status);
                        var b = new FileReader;
                        b.onloadend = function() {
                            var a = b.result.split(/,/)[1];
                            c(a)
                        }, b.readAsDataURL(g.response)
                    }
                }

                function e() { f("timeout of " + b + "ms occured while fetching resource: " + a) }

                function f(a) { console.error(a), c("") }
                var g = new XMLHttpRequest;
                g.onreadystatechange = d, g.ontimeout = e, g.responseType = "blob", g.timeout = b, g.open("GET", a, !0), g.send()
            })
        }

        function k(a, b) {
            return "data:" + b + ";base64," + a
        }

        function l(a) {
            return a.replace(/([.*+?^${}()|\[\]\/\\])/g, "\\$1")
        }

        function m(a) {
            return function(b) {
                return new Promise(function(c) { setTimeout(function() { c(b) }, a) })
            }
        }

        function n(a) {
            for (var b = [], c = a.length, d = 0; d < c; d++) b.push(a[d]);
            return b
        }

        function o(a) {
            return a.replace(/#/g, "%23").replace(/\n/g, "%0A")
        }

        function p(a) {
            var b = r(a, "border-left-width"),
                c = r(a, "border-right-width");
            return a.scrollWidth + b + c
        }

        function q(a) {
            var b = r(a, "border-top-width"),
                c = r(a, "border-bottom-width");
            return a.scrollHeight + b + c
        }

        function r(a, b) {
            var c = window.getComputedStyle(a).getPropertyValue(b);
            return parseFloat(c.replace("px", ""))
        }
        return { escape: l, parseExtension: b, mimeType: c, dataAsUrl: k, isDataUrl: d, canvasToBlob: f, resolveUrl: g, getAndEncode: j, uid: h(), delay: m, asArray: n, escapeXhtml: o, makeImage: i, width: p, height: q }
    }

    function m() {
        function a(a) {
            return a.search(e) !== -1
        }

        function b(a) {
            for (var b, c = []; null !== (b = e.exec(a));) c.push(b[1]);
            return c.filter(function(a) {
                return !p.isDataUrl(a)
            })
        }

        function c(a, b, c, d) {
            function e(a) {
                return new RegExp("(url\\(['\"]?)(" + p.escape(a) + ")(['\"]?\\))", "g")
            }
            return Promise.resolve(b).then(function(a) {
                return c ? p.resolveUrl(a, c) : a
            }).then(d || p.getAndEncode).then(function(a) {
                return p.dataAsUrl(a, p.mimeType(b))
            }).then(function(c) {
                return a.replace(e(b), "$1" + c + "$3")
            })
        }

        function d(d, e, f) {
            function g() {
                return !a(d)
            }
            return g() ? Promise.resolve(d) : Promise.resolve(d).then(b).then(function(a) {
                var b = Promise.resolve(d);
                return a.forEach(function(a) {
                    b = b.then(function(b) {
                        return c(b, a, e, f)
                    })
                }), b
            })
        }
        var e = /url\(['"]?([^'"]+?)['"]?\)/g;
        return { inlineAll: d, shouldProcess: a, impl: { readUrls: b, inline: c } }
    }

    function n() {
        function a() {
            return b(document).then(function(a) {
                return Promise.all(a.map(function(a) {
                    return a.resolve()
                }))
            }).then(function(a) {
                return a.join("\n")
            })
        }

        function b() {
            function a(a) {
                return a.filter(function(a) {
                    return a.type === CSSRule.FONT_FACE_RULE
                }).filter(function(a) {
                    return q.shouldProcess(a.style.getPropertyValue("src"))
                })
            }

            function b(a) {
                var b = [];
                return a.forEach(function(a) {
                    try { p.asArray(a.cssRules || []).forEach(b.push.bind(b)) } catch (c) { console.log("Error while reading CSS rules from " + a.href, c.toString()) }
                }), b
            }

            function c(a) {
                return {
                    resolve: function() {
                        var b = (a.parentStyleSheet || {}).href;
                        return q.inlineAll(a.cssText, b)
                    },
                    src: function() {
                        return a.style.getPropertyValue("src")
                    }
                }
            }
            return Promise.resolve(p.asArray(document.styleSheets)).then(b).then(a).then(function(a) {
                return a.map(c)
            })
        }
        return { resolveAll: a, impl: { readAll: b } }
    }

    function o() {
        function a(a) {
            function b(b) {
                return p.isDataUrl(a.src) ? Promise.resolve() : Promise.resolve(a.src).then(b || p.getAndEncode).then(function(b) {
                    return p.dataAsUrl(b, p.mimeType(a.src))
                }).then(function(b) {
                    return new Promise(function(c, d) { a.onload = c, a.onerror = d, a.src = b })
                })
            }
            return { inline: b }
        }

        function b(c) {
            function d(a) {
                var b = a.style.getPropertyValue("background");
                return b ? q.inlineAll(b).then(function(b) { a.style.setProperty("background", b, a.style.getPropertyPriority("background")) }).then(function() {
                    return a
                }) : Promise.resolve(a)
            }
            return c instanceof Element ? d(c).then(function() {
                return c instanceof HTMLImageElement ? a(c).inline() : Promise.all(p.asArray(c.childNodes).map(function(a) {
                    return b(a)
                }))
            }) : Promise.resolve(c)
        }
        return { inlineAll: b, impl: { newImage: a } }
    }
    var p = l(),
        q = m(),
        r = n(),
        s = o(),
        t = { toSvg: b, toPng: d, toJpeg: e, toBlob: f, toPixelData: c, impl: { fontFaces: r, images: s, util: p, inliner: q } };

    if (typeof module != 'undefined' && module.exports) {
        module.exports = t;
    } else if (typeof define == 'function' && define.amd) {
        define(function() {
            return t;
        });
    } else {
        window.Printer = t;
    }
}(window);
